#include "Aip33624.h"
#include "usart.h"
#include "timer.h"
#include "HX710C.h"
#include "WaterPump.h"






u8 addr1[10][8]={
	
								0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,   //GRID1/2/3/4/5/6/7/8~SEG1
								0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,   //GRID1/2/3/4/5/6/7/8~SEG2
								0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,   //GRID1/2/3/4/5/6/7/8~SEG3
								0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,   //GRID1/2/3/4/5/6/7/8~SEG4
								0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,   //GRID1/2/3/4/5/6/7/8~SEG5
								0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,   //GRID1/2/3/4/5/6/7/8~SEG6
								0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,   //GRID1/2/3/4/5/6/7/8~SEG7
								0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,   //GRID1/2/3/4/5/6/7/8~SEG8
	
								0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,   //GRID1/2/3/4/5/6/7/8~SEG9
								0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,   //GRID1/2/3/4/5/6/7/8~SEG10
};

u8 addr2[10][8]={
	
								0xc0,0xc1,0xc2,0xc3,0xc4,    0xc5,0xc6,0xc7,   //GRID1/2/3/4/5/6/7/8~SEG1    //绿
								0xc8,0xc9,0xca,0xcb,0xcc,    0xcd,0xce,0xcf,   //GRID1/2/3/4/5/6/7/8~SEG2    //红
								0xd0,0xd1,0xd2,0xd3,0xd4,    0xd5,0xd6,0xd7,   //GRID1/2/3/4/5/6/7/8~SEG3    //蓝
								0xd8,0xd9,0xda,0xdb,0xdc,    0xdd,0xde,0xdf,   //GRID1/2/3/4/5/6/7/8~SEG4    //绿
								0xe0,0xe1,0xe2,0xe3,0xe4,    0xe5,0xe6,0xe7,   //GRID1/2/3/4/5/6/7/8~SEG5    //红
								0xe8,0xe9,0xea,0xeb,0xec,    0xed,0xee,0xef,	  //GRID1/2/3/4/5/6/7/8~SEG6    //蓝
	
	
								0xf0,0xf1,0xf2,0xf3,0xf4,0xf5, 0xf6,0xf7,   //GRID1/2/3/4/5/6/7/8~SEG7
								0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfe,0xff,   //GRID1/2/3/4/5/6/7/8~SEG8
								0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,   //GRID1/2/3/4/5/6/7/8~SEG9
								0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xce,0xcf,   //GRID1/2/3/4/5/6/7/8~SEG10
};

//u8 green[10]  ={0xc0,0xd8, 0xc1,0xd9, 0xc2,0xda, 0xc3,0xdb,0xc4,0xdc};   //正排序
u8 green[10]  ={0xdc,0xc4, 0xdb,0xc3, 0xda,0xc2, 0xd9,0xc1,0xd8,0xc0};    //反排序

/***********************************************************
//	*	函数名称： AIP_GPIO_Init()
//	* 功能    ： IIC引脚初始化
//	*	参数    ： SCL PB8    SDA PB9
//	*	返回值  :  无
***********************************************************/
void AIP_GPIO_Init(void)
{
		GPIO_Config_T gpioConfig;
    RCM_EnableAHBPeriphClock(RCM_AHB_PERIPH_GPIOB);
		
    gpioConfig.pin = AIP_PIN_CLK;
    gpioConfig.mode = GPIO_MODE_OUT;
    gpioConfig.outtype = GPIO_OUT_TYPE_PP;
    gpioConfig.speed = GPIO_SPEED_50MHz;
    gpioConfig.pupd = GPIO_PUPD_PU;
    GPIO_Config(AIP_GPIO_CLK, &gpioConfig);

		gpioConfig.pin = AIP_PIN_DIO;
    gpioConfig.mode = GPIO_MODE_OUT;
    gpioConfig.outtype = GPIO_OUT_TYPE_OD;
    gpioConfig.speed = GPIO_SPEED_50MHz;
    gpioConfig.pupd = GPIO_PUPD_PU;
    GPIO_Config(AIP_GPIO_DIO, &gpioConfig);
}
/**********************************************************
//	*	函数名称： Aip_Start()
//	* 功能    ： IIC开始信号
//	*	参数    ： 无 
//	*	返回值  :  无
***********************************************************/
void Aip_Start(void)  
{
	AIP_DIO_1;
	delay_us(1);
	AIP_CLK_1;
	delay_us(1);
	AIP_DIO_0;
	delay_us(1);
	AIP_CLK_0;
	delay_us(1);
}

/**********************************************************
//	*	函数名称： Aip_Stop()
//	* 功能    ： IIC停止信号
//	*	参数    ： 无 
//	*	返回值  :  无
***********************************************************/
void Aip_Stop(void)
{
	AIP_CLK_0;
	delay_us(1);
	AIP_DIO_0;
	delay_us(1);
	AIP_CLK_1;
	delay_us(1);
	AIP_DIO_1;
	delay_us(1);
}
/**********************************************************
//	*	函数名称： Aip33624_Wrirte(u8 data)
//	* 功能    ： 8字节传输数据
//	*	参数    ： 8字节数据 
//	*	返回值  :  无
***********************************************************/
void Aip33624_Wrirte(u8 data)
{
	u8 i;
  for(i = 0;i < 8;i++) 
	{
		AIP_CLK_0;
		delay_us(1);
		if(data & 0x80)
		{
			AIP_DIO_1;
		}
		else
		{
			AIP_DIO_0;
		}
		delay_us(1);		
		AIP_CLK_1;
		data = data << 1;
		delay_us(1);
	}
}
/**********************************************************
//	*	函数名称： Aip_Write_Cmd(u8 cmd)
//	* 功能    ： 发送命令
//	*	参数    ： 数据命令 
//	*	返回值  :  无
***********************************************************/
void Aip_Write_Cmd(u8 cmd)
{
	Aip_Start();
	Aip33624_Wrirte(cmd);
	Aip_Stop();
}

/**********************************************************
//	*	函数名称： AIP33624_Init()
//	* 功能    ： AIP 初始化
//	*	参数    ： 无 
//	*	返回值  :  无
***********************************************************/
void AIP33624_Init(void)
{
	Aip_Write_Cmd(0x1f);  //设置SEG输出恒流大小
	Aip_Write_Cmd(0x78);  //GRID1~GRID5有效
	Aip_Write_Cmd(0x82);   //GRID扫描以及扫描时间设定，显示关
	Aip33624_WriteData(0xc0,0x00);
	Aip_Write_Cmd(0x8e);  //GRID扫描以及扫描时间设定，显示开
}

/**********************************************************
//	*	函数名称： 显示数据定点改写
//	* 功能  ：全写RAM数据
//	*	参数：addr 对应 addr2[] 里面地址 
//	*	返回值 :无
***********************************************************/

void Aip33624_WriteData(u8 address,u8 dat)
{
	u8 i;
	Aip_Write_Cmd(0x60);    //GRID1~GRID5有效
	Aip_Start();
//	Aip33624_Wrirte(0x20);
	Aip33624_Wrirte(address);
	for(i = 0;i < 50 ;i++)
	{
		Aip33624_Wrirte(dat);
	}
	Aip_Stop();
}


/**********************************************************
//	*	函数名称： AIP_Display
//	* 功能:显示数据定点改写  固定地址
//	*	参数:addr 对应 addr2[] 里面地址  
//	*	返回值 :无
***********************************************************/
void  AIP_Display(u8 addr,u8 DATA)
{

		Aip_Write_Cmd(0x64);  //GRID1~GRID5 有效
		Aip_Start();           //开始
		Aip33624_Wrirte(0x20); //写入地址1
		Aip_Stop();           //结束
		Aip_Start();            //开始
		Aip33624_Wrirte(addr);   //写入地址二
		Aip33624_Wrirte(DATA);   //写入数据
		Aip_Stop();  	//结束
		delay_us(1);

}


/***********************************************************
函数名称 ：AIP_Display_1()
参数：addr 对应 green[] 里面地址
DATA : 红灯数据
data ：绿灯数据
dat  ：蓝灯数据
************************************************************/
void AIP_Display_1(u8 addr,u8 DATA,u8 data, u8 dat)   //绿灯首地址
{
		Aip_Write_Cmd(0x64);  //GRID1~GRID5 有效
		Aip_Start();           //开始
		Aip33624_Wrirte(0x20); //写入地址1
		Aip_Stop();           //结束
		Aip_Start();            //开始
		Aip33624_Wrirte(addr+8);   //红
		Aip33624_Wrirte(DATA);   //写入数据
		Aip_Stop();  	//结束
		delay_us(5);
	
		Aip_Write_Cmd(0x64);  
		Aip_Start();           
		Aip33624_Wrirte(0x20); 
		Aip_Stop();          
		Aip_Start();           
		Aip33624_Wrirte(addr);    //绿
		Aip33624_Wrirte(data);   
		Aip_Stop();  	
		delay_us(5);
	
		Aip_Write_Cmd(0x64);  
		Aip_Start();           
		Aip33624_Wrirte(0x20); 
		Aip_Stop();           
		Aip_Start();            
		Aip33624_Wrirte(addr+16);     //蓝
		Aip33624_Wrirte(dat);   
		Aip_Stop();  	
		delay_us(5);
}



/************************************************************
// 函数名称 ： LED_Water_Wight

//参数： 0-10，对应要开的灯数
           
//反向请把 green[]数组调换位置
************************************************************/
void LED_Water_Wight(u8 Num)
{
	u8 i;
	for(i=0;i<10-Num;i++)
	AIP_Display_1(green[10-i-1],0,0,0);       //把不需要量的灯关闭
	switch(Num)
	{
		case 10:
			for(i=0;i<Num;i++)                     //10个灯全开
			AIP_Display_1(green[i],0,0,255);
			break;
		case 9:                                 //9个灯开
			for(i=0;i<Num;i++)
			AIP_Display_1(green[i],0,0,230);
			break;
		case 8:                    
			for(i=0;i<Num;i++)
			AIP_Display_1(green[i],0,0,150);
			break;
		case 7:
				for(i=0;i<Num;i++)
				AIP_Display_1(green[i],5,5,130);
			break;
		case 6:
				for(i=0;i<Num;i++)
				AIP_Display_1(green[i],20,20,100);
			break;
		case 5:
				for(i=0;i<Num;i++)
				AIP_Display_1(green[i],50,50,100);
			break;
		case 4:
				for(i=0;i<Num;i++)
				AIP_Display_1(green[i],100,100,50);
			break;
		case 3:
				for(i=0;i<Num;i++)
				AIP_Display_1(green[i],180,180,50);
			break;
		case 2:
				for(i=0;i<Num;i++)
				AIP_Display_1(green[i],200,200,0);
			break;
		case 1:
				Yellow_Blink();
			break;
		default:
				Aip33624_WriteData(0xc0,0x00);
			break;
	}
}






u8 Yellow_flag = 0;
/************************************************************
//	*	函数名称： Yellow_Blink()
//	* 功能    ： 水量见底 ，最后一个黄灯进行闪烁 ，利用定时器中断计数
//	*	参数    ： 无 
//	*	返回值  :  无
************************************************************/
void Yellow_Blink(void) 
{
		if(Yellow_flag == 0 )
		{
			AIP_Display_1(green[0],255,255,0);
			Yellow_flag = 1;
		}
		else
		{
			Aip33624_WriteData(0xc0,0x00);	 
				Yellow_flag = 0;
		}
}



//////////////////////****************红灯呼吸**********************///////////////
uint32_t yellow_tick=0;
void Red_Blink(void)
{
	AIP_Display_1(green[1],0,0,0);
	AIP_Display_1(green[2],0,0,0);
	AIP_Display_1(green[3],0,0,0);
	AIP_Display_1(green[4],0,0,0);
	AIP_Display_1(green[5],0,0,0);
	AIP_Display_1(green[6],0,0,0);
	AIP_Display_1(green[7],0,0,0);
	AIP_Display_1(green[8],0,0,0);
	AIP_Display_1(green[7],0,0,0);
	AIP_Display_1(green[0],yellow_tick,0,0);
}


u8 red_Led_flag=0;

void Count_led_blink(void)
{
	if(red_Led_flag == 1)
		yellow_tick--;
	else
		yellow_tick++;         //RGB灯闪烁计时
	
	if(yellow_tick>=255)
		red_Led_flag=1;
	
	if(yellow_tick<=0)
		
		red_Led_flag=0;
	
	
}
